﻿using System;

namespace Kyoh.Lib.Excel
{
    /// <summary>Microsoft Excel のブックを表します。</summary>
	public class Workbook : Component
	{
		private Workbook(object exWorkbook, Component parent)
			: base(exWorkbook, parent)
		{
		}

        /// <summary>Excel COM オブジェクトで、新しいインスタンスを初期化します。</summary>
        /// <param name="obj">Excel COM オブジェクト</param>
        /// <param name="parent">親となる <see cref="Component"/> オブジェクト。</param>
		internal static Workbook Create(object obj, Component parent)
		{
			return obj == null ? null : new Workbook(obj, parent);
		}

        /// <summary>ワークブックをアクティブにします。</summary>
		public void Activate()
		{
			base.InvokeMethod("Activate");
		}

        /// <summary>ワークブック内のアクティブなシートを取得します。</summary>
		public Worksheet ActiveSheet { get { return Worksheet.Create(base.GetProperty("ActiveSheet"), this); } }

        /// <summary>ワークブックを閉じます。</summary>
        /// <param name="SaveChanges">変更を保存する場合は <c>true</c> 。規定値は <c>false</c> 。</param>
        /// <param name="Filename">保存するファイル名。</param>
        public void Close(bool? SaveChanges = null, string Filename = null)//, object RouteWorkbook = null)
        {
            base.InvokeMethod("Close", SaveChanges ?? Type.Missing, Filename ?? Type.Missing);
        }

        /// <summary>ワークブックのフルパスを取得します。</summary>
		public string FullName
		{
			get { return (string)base.GetProperty("FullName"); }
		}

        /// <summary>サーバー上のワークブックをロックします。</summary>
		public void LockServerFile()
		{
			base.InvokeMethod("LockServerFile");
		}

        /// <summary>ワークブックを結合します。</summary>
        /// <param name="filename">結合するファイル名。</param>
		public void MergeWorkbook(string filename)
		{
			base.InvokeMethod("MergeWorkbook", filename);
		}

        /// <summary>ワークブックのファイル名を取得します。</summary>
		public string Name
		{
			get { return (string)base.GetProperty("Name"); }
		}

        /// <summary>ワークブックのディレクトリパスを取得します。</summary>
		public string Path
		{
			get { return (string)base.GetProperty("Path"); }
		}

        /// <summary>ワークブックを保護します。</summary>
        /// <param name="Password">パスワード。</param>
        /// <param name="Structure">シートの並び位置を保護する場合は <c>true</c> 。規定値は <c>false</c> 。</param>
        /// <param name="Windows">ブックウィンドウを保護する場合は <c>true</c> 。規定値は <c>false</c> 。</param>
        public virtual void Protect(
            string Password = null,
            bool? Structure = null,
            bool? Windows = null)
        {
            base.InvokeMethod("Protect",
                Password ?? Type.Missing,
                Structure ?? Type.Missing,
                Windows ?? Type.Missing);
        }
        /// <summary>ワークブックを保存します。</summary>
        public void Save()
        {
            base.InvokeMethod("Save");
        }

        /// <summary>ファイル名と形式を指定してワークブックを保存します。</summary>
        /// <param name="Filename">ファイル名。</param>
        /// <param name="format">保存する形式。</param>
		public void SaveAs(string Filename, FileFormat format = FileFormat.Excel12)
		{
			base.InvokeMethod("SaveAs",
				Filename,		// string Filename, 
				format,			// object FileFormat,
				Type.Missing,	// object Password, 
				Type.Missing,	// object WriteResPassword, 
				Type.Missing,	// object ReadOnlyRecommended, 
				Type.Missing,	// object CreateBackup, 
				Type.Missing,	// XlSaveAsAccessMode AccessMode, 
				Type.Missing,	// object ConflictResolution, 
				Type.Missing,	// object AddToMru, 
				Type.Missing,	// object TextCodepage, 
				Type.Missing,	// object TextVisualLayout, 
				Type.Missing);	// object Local
		}

        /// <summary>すべてのシートを取得します。</summary>
		public Worksheets Worksheets { get { return Worksheets.Create(base.GetProperty("Worksheets"), this); } }

	}
}